package com.yic.module.qms.service.inspectschemeitem;

import cn.hutool.core.collection.CollectionUtil;
import com.yic.module.qms.controller.admin.inspectschemeentry.vo.InspectSchemeEntryRespVO;
import com.yic.module.qms.dal.dataobject.inspectscheme.InspectSchemeDO;
import com.yic.module.qms.service.inspectscheme.InspectSchemeService;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import java.util.stream.Collectors;

import com.yic.module.qms.controller.admin.inspectschemeitem.vo.*;
import com.yic.module.qms.dal.dataobject.inspectschemeitem.InspectSchemeItemDO;
import com.yic.framework.common.pojo.PageResult;

import com.yic.module.qms.convert.inspectschemeitem.InspectSchemeItemConvert;
import com.yic.module.qms.dal.mysql.inspectschemeitem.InspectSchemeItemMapper;

import static com.yic.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yic.module.qms.enums.ErrorCodeConstants.*;

/**
 * 检验方案产品关联 Service 实现类
 *
 * @author 系统管理员
 */
@Service
@Validated
public class InspectSchemeItemServiceImpl implements InspectSchemeItemService {

    @Resource
    private InspectSchemeItemMapper inspectSchemeItemMapper;
    @Resource
    private InspectSchemeService inspectSchemeService;

    @Override
    public Long createInspectSchemeItem(InspectSchemeItemCreateReqVO createReqVO) {
        validateInspectSchemeItemBinded(createReqVO.getSchemeId(), createReqVO.getItemId());
        // 插入
        InspectSchemeItemDO inspectSchemeItem = InspectSchemeItemConvert.INSTANCE.convert(createReqVO);
        inspectSchemeItemMapper.insert(inspectSchemeItem);
        // 返回
        return inspectSchemeItem.getId();
    }

    @Override
    public void updateInspectSchemeItem(InspectSchemeItemUpdateReqVO updateReqVO) {
        // 校验存在
        validateInspectSchemeItemExists(updateReqVO.getId());
        // 更新
        InspectSchemeItemDO updateObj = InspectSchemeItemConvert.INSTANCE.convert(updateReqVO);
        inspectSchemeItemMapper.updateById(updateObj);
    }

    @Override
    public void deleteInspectSchemeItem(Long id) {
        // 校验存在
        validateInspectSchemeItemExists(id);
        // 删除
        inspectSchemeItemMapper.deleteById(id);
    }

    @Override
    public void deleteInspectSchemeItemBySchemeId(Long schemeId) {
        inspectSchemeItemMapper.deleteBySchemeId(schemeId);
    }

    private void validateInspectSchemeItemExists(Long id) {
        if (inspectSchemeItemMapper.selectById(id) == null) {
            throw exception(INSPECT_SCHEME_ITEM_NOT_EXISTS);
        }
    }

    private void validateInspectSchemeItemBinded(Long schemeId, Long itemId) {
        List<InspectSchemeItemDO> inspectSchemeItemDOS = inspectSchemeItemMapper.selectListByItemId(itemId);
        // 校验当前方案下唯一
        // 校验同种类下唯一
        Set<Long> schemeIds = inspectSchemeItemDOS.stream().map(InspectSchemeItemDO::getSchemeId).collect(Collectors.toSet());
        if (CollectionUtil.isNotEmpty(schemeIds)) {
            List<InspectSchemeDO> inspectSchemeList = inspectSchemeService.getInspectSchemeList(schemeIds);
            InspectSchemeDO inspectScheme = inspectSchemeService.getInspectScheme(schemeId);
            Set<Integer> types = inspectSchemeList.stream().map(InspectSchemeDO::getInspectType).collect(Collectors.toSet());
            if (types.contains(inspectScheme.getInspectType())) {
                throw exception(INSPECT_SCHEME_ITEM_BIND_EXISTS);
            }
        }
    }

    @Override
    public InspectSchemeItemDO getInspectSchemeItem(Long id) {
        return inspectSchemeItemMapper.selectById(id);
    }

    @Override
    public List<InspectSchemeItemDO> getInspectSchemeItemList(Collection<Long> ids) {
        return inspectSchemeItemMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<InspectSchemeItemDO> getInspectSchemeItemPage(InspectSchemeItemPageReqVO pageReqVO) {
        return inspectSchemeItemMapper.selectPage(pageReqVO);
    }

    @Override
    public List<InspectSchemeItemDO> getInspectSchemeItemList(InspectSchemeItemExportReqVO exportReqVO) {
        return inspectSchemeItemMapper.selectList(exportReqVO);
    }

    @Override
    public List<InspectSchemeItemDO> getInspectSchemeItemListByItem(Long itemId) {
        return inspectSchemeItemMapper.selectListByItemId(itemId);
    }


}
